package com.dzx.currentency.sync;

import com.sun.corba.se.impl.orbutil.concurrent.Sync;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author DuanZhaoXu
 * @ClassName:
 * @Description:
 * @date 2018年11月17日 16:48:35
 */
@Slf4j
public class SynchronizedExample1 {

    //修饰一个代码块,作用范围：整个代码块，只作用于调用于该方法的对象，不同的对象之间互不影响
    public void test1(String objectName) {
        synchronized (this) {
            for (int i = 0; i < 10; i++) {
                log.info("test1-" + objectName + "-{}", i);
            }
        }
    }

    //修饰一个方法，作用范围：整个方法，只作用于调用于该方法的对象，不同的对象之间互不影响
    public synchronized void test2(String objectName) {
        for (int i = 0; i < 10; i++) {
            log.info("test2-" + objectName + "-{}", i);
        }
    }


    //修饰静态方法，作用范围：整个方法，作用于所有对象，不同的对象也会相互影响，进行锁竞争
    public static synchronized void test3(String objectName) {
        for (int i = 0; i < 10; i++) {
            log.info("test2-" + objectName + "-{}", i);
        }
    }

    //修饰静态方法，作用范围：整个方法，作用于所有对象，不同的对象也会相互影响，进行锁竞争
    public static synchronized void test4(String objectName) {
        synchronized (SynchronizedExample1.class) {
            for (int i = 0; i < 10; i++) {
                log.info("test2-" + objectName + "-{}", i);
            }
        }
    }


    public static void main(String[] args) {
        //声明一个对象
        SynchronizedExample1 synchronizedExample1 = new SynchronizedExample1();
        ExecutorService service = Executors.newCachedThreadPool();
//        service.execute(() -> {
//           // synchronizedExample1.test1("Example1");
//            synchronizedExample1.test2("Example1");
//        });
//        service.execute(()->{
//           // synchronizedExample1.test1("Example1");
//            synchronizedExample1.test2("Example1");
//        });

         //声明二个对象
        SynchronizedExample1 synchronizedExample2 = new SynchronizedExample1();
//        service.execute(() -> {
//            // synchronizedExample1.test1("Example1");
//            synchronizedExample1.test2("Example1");
//        });
//        service.execute(()->{
//            // synchronizedExample1.test1("Example1");
//            synchronizedExample2.test2("Example2");
//        });


//        service.execute(() -> {
//            // synchronizedExample1.test1("Example1");
//            synchronizedExample1.test3("Example1");
//        });
//        service.execute(()->{
//            // synchronizedExample1.test1("Example1");
//            synchronizedExample2.test3("Example2");
//        });

        service.execute(() -> {
            // synchronizedExample1.test1("Example1");
            synchronizedExample1.test4("Example1");
        });
        service.execute(() -> {
            // synchronizedExample1.test1("Example1");
            synchronizedExample2.test4("Example2");
        });
    }
}
